# 学生成绩管理系统

# 增删改查学生成绩
#       * 增加
#       * 删除
#       * 修改
#       * 列表所有
#       * 查询某学号学生信息
#       * 模糊查询学生姓名的信息
#       * 查询所有需要补考的学生信息
#       * 按总分从高到低打印学生信息

# 学生信息
# 学号   姓名   语文   数学   外语
# 1001  张三    87    98    100
# 1002  李四    97    89    77
# 1003  王五    84    55    99

# 开始
students = []
# students = [{'学号':'1001','姓名':'张三','语文':'87','数学':'98','外语':'100'},
#             {'学号':'1002','姓名':'李四','语文':'97','数学':'89','外语':'77'},
#             {'学号':'1003','姓名':'王五','语文':'84','数学':'55','外语':'99'},
#             {'学号':'1004','姓名':'张三','语文':'84','数学':'55','外语':'99'}]


def printMenu():
    print('欢迎使用<便利快>学生成绩管理系统')
    print('请选择你要执行的操作')
    print('1.增加学生成绩信息')
    print('2.删除学生成绩信息')
    print('3.修改学生成绩信息')
    print('4.列出所有学生成绩信息')
    print('5.查询某学号学号学生信息')
    print('6.模糊查询学生姓名信息')
    print('7.查询所有需要补考的学生信息')
    print('8.按总分从高到低打印学生信息')
    print('9.保存学生信息')
    print('10.读取学生信息')
    print('11.结束使用<便利快>学生成绩管理系统')

def add():       # 增加学生成绩信息
    print('1.增加学生成绩信息')
    number = input('请输入学生学号：')
    name = input('请输入学生姓名：')
    chineseGrade = input('请输入学生语文成绩：')
    mathGrade = input('请输入学生数学成绩：')
    englishGrade = input('请输入学生外语成绩：')

    students.append({'学号':number,'姓名':name,'语文':chineseGrade,'数学':mathGrade,'外语':englishGrade})


def delete():
    number = input('请输入需要删除学生的学号：')
    for student in students:
        if student['学号']==number:
            students.remove(student)

def modify():
    number = input('请输入需要修改的学生学号：')
    name = input('请输入需要修改的学生的姓名：')
    chiese = input('请输入需要修改的学生的语文成绩：')
    math = input('请输入需要修改的学生的数学成绩：')
    english = input('请输入需要修改的学生的英语成绩：')
    for student in students:
        if student['学号']==number:
            student['姓名'] = name
            student['语文'] = chiese
            student['数学'] = math
            student['外语'] = english
            break

def listall():
    print('4.列出所有学生成绩信息')
    print('学号\t\t\t姓名\t\t\t语文\t\t\t数学\t\t\t外语')
    for student in students:
        print(student['学号']+'\t\t'+student['姓名']+'\t\t\t'+student['语文']+'\t\t\t'+student['数学']+'\t\t\t'+student['外语'])

def search():
    number = input('请输入需要查询学生的学号：')
    print('学号'+'\t\t\t'+'姓名'+'\t\t\t'+'语文'+'\t\t\t'+'数学'+'\t\t\t'+'外语'+'\t\t\t')
    for student in students:
        if student['学号']==number:
            print(student['学号']+'\t\t'+student['姓名']+'\t\t\t'+student['语文']+'\t\t\t'+student['数学']+'\t\t\t'+student['外语'])

def dimsearch():
    name = input('请输入需要查询的学生姓名：')
    print('6.模糊查询学生姓名信息')
    print('学号' + '\t\t\t' + '姓名' + '\t\t\t' + '语文' + '\t\t\t' + '数学' + '\t\t\t' + '外语' + '\t\t\t')
    for student in students:
        if student['姓名'] == name:
            print(student['学号'] + '\t\t' + student['姓名'] + '\t\t\t' + student['语文'] + '\t\t\t' + student['数学'] + '\t\t\t' + student['外语'])


def searchMakeup():
    print('7.查询所有需要补考的学生信息')
    print('学号' + '\t\t\t' + '姓名' + '\t\t\t' + '语文' + '\t\t\t' + '数学' + '\t\t\t' + '外语' + '\t\t\t')
    for student in students:
        if int(student['语文']) < 60 or int(student['数学']) < 60 or int(student['外语']) < 60:
            print(student['学号'] + '\t\t' + student['姓名'] + '\t\t\t' + student['语文'] + '\t\t\t' + student['数学'] + '\t\t\t' + student['外语'])


def hightolowprint():
    print('8.按总分从高到低打印学生信息')
    print('学号' + '\t\t\t' + '姓名' + '\t\t\t' + '语文' + '\t\t\t' + '数学' + '\t\t\t' + '外语' + '\t\t\t')

    process_socre_list = []                              # 定义一个中间列表 用来存放 学号 与之对应 总成绩

    for i in range(len(students)):
        total_socres = int(students[i]['语文']) + int(students[i]['数学']) + int(students[i]['外语'])   # 计算出每一位同学的总成绩
        new_number_score = (int(students[i]['学号']),total_socres)              #构建一个新的 （学号，总分数） 的元组
        process_socre_list.append(new_number_score)                            # 将每一个 （学号，总分数）的元组看成是列表中的一个元素添加进列表

    import operator
    process_socre_list.sort(key=operator.itemgetter(1), reverse=True)          # 将列表 按照每个元素（元组中的总分） 由大到小排列

    for j in range(len(process_socre_list)):                                   # 提取出成绩由大到小对应学号的下标
        for student in students:                                               # 从列表students中提取每一个元素（学生的成绩信息）
            if int(student['学号']) == int(process_socre_list[j][0]):
                print(student['学号'] + '\t\t' + student['姓名'] + '\t\t\t' + student['语文'] + '\t\t\t' + student['数学'] + '\t\t\t' + student['外语'])


def save():
    print('9.保存学生信息')
    f = open('学生成绩表.txt', 'w')  # 创建一个联系人文本
    for student in students:  # 遍历内存中的联系人信息
        f.write(f'{student["学号"]},{student["姓名"]},{student["语文"]},{student["数学"]},{student["外语"]}\n')
    f.close()

def read():
    print('10.读取学生信息')
    f = open('学生成绩表.txt', 'r')  # 打开硬盘内的通讯录文本文件 且选读取模式
    content = f.read()  # 将文件内的内容进行变量定义
    lines = content.split('\n')  # 将内容进行按行分割
    for line in lines:  # 遍历每一行
        # print(line)
        infor = line.split(',')  # 将每一行的内容按照逗号分割
        # print(infor)
        if len(infor) > 1:  # 只要行的信息长度大于1 则写入空列表中
            dict = {'学号': infor[0], '姓名': infor[1], '语文': infor[2], '数学': infor[3], '外语': infor[4]}  # 将每行内容打包成字典
            students.append(dict)  # 将打包好的字典 添加进之前定义的空列表中
    f.close()



while True:                             # 创建主程序 是一个不人为选择跳出就会一直循环的死循环
    printMenu()
    sel = int(input("你要执行的操作："))
    if sel == 1:
        add()
        print()
    elif sel == 2:
        delete()
        print()
    elif sel == 3:
        modify()
        print()
    elif sel == 4:
        listall()
        print()
    elif sel == 5:
        search()
        print()
    elif sel == 6:
        dimsearch()
        print()
    elif sel == 7:
        searchMakeup()
        print()
    elif sel == 8:
        hightolowprint()
        print()
    elif sel == 9:
        save()
        print()
    elif sel == 10:
        read()
        print()
    elif sel == 11:
        break
